package com.itheima.d5_dynamic_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUtil {

    //被代理对象当作参数传入代理对象中
    public static UserService createProxy(UserService userService){

        UserService userServiceProxy = (UserService) Proxy.newProxyInstance(

//           参数1：用于指定一个类加载器
                    ProxyUtil.class.getClassLoader(),

//           参数2：指定生成的代理长什么样子，也就是有哪些方法
                new Class[]{UserService.class},

//           参数3：用来指定生成的代理对象要干什么事情
                new InvocationHandler() {

//              invoke方法：回调方法，会在代理对象的每个方法被调用时执行
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //proxy 代理对象 不用
                        //methid 方法对象
                        //args 方法参数

                        if(method.getName().equals("login") || method.getName().equals("deleteUsers")||
                               method.getName().equals("selectUsers")){
                            long startTime = System.currentTimeMillis();

                            Object rs = method.invoke(userService, args);

                            long endTime = System.currentTimeMillis();
                            System.out.println(method.getName() + "方法执行耗时：" + (endTime - startTime)/ 1000.0 + "s");
                            return rs;
                        }else {
                            Object rs = method.invoke(userService, args);
                            return rs;
                        }
                    }
                });
        return userServiceProxy;
    }
}
